<?php namespace App\Http\Controllers;

use App\Http\Models\Common_util_pub;
use App\Http\Models\Train;
use App\Http\Models\User;
use App\Http\Models\UserOrder;
use Illuminate\Support\Facades\Input;
use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Facades\Request;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\View;
use \Illuminate\Support\Facades\Response;

require_once(__DIR__.'/../WxPayPubHelper/WxPayPubHelper.php');
require_once(__DIR__.'/../WxPayPubHelper/WxPay.pub.config.php');
require_once(__DIR__.'/../WxPayPubHelper/SDKRuntimeException.php');




class PayController extends Controller
{



    public function doRecharge()
    {
        $this->middleware('CusAuth');

        if(Request::isMethod('post'))
        {

            //本地订单
            $order=UserOrder::createOrder(Input::all());

            if($order)
            {

                $order_id=$order->id;
              //生成网络订单
//               / **
//                * JS_API支付demo
//                            * ====================================================
//                 * 在微信浏览器里面打开H5网页中执行JS调起支付。接口输入输出数据格式为JSON。
//                 * 成功调起支付需要三个步骤：
//                 * 步骤1：网页授权获取用户openid
//                            * 步骤2：使用统一支付接口，获取prepay_id
//                            * 步骤3：使用jsapi调起支付
//            */



                //使用jsapi接口
                $jsApi = new JsApi_pub();

                //=========步骤1：网页授权获取用户openid============
                //通过code获得openid
                $openid=User::Auth()->CWebChatID;

                //=========步骤2：使用统一支付接口，获取prepay_id============
                //使用统一支付接口
                $unifiedOrder = new UnifiedOrder_pub();

                //设置统一支付接口参数
                //设置必填参数
                //appid已填,商户无需重复填写
                //mch_id已填,商户无需重复填写
                //noncestr已填,商户无需重复填写
                //spbill_create_ip已填,商户无需重复填写
                //sign已填,商户无需重复填写

                $unifiedOrder->setParameter("openid","$openid");//商品描述
                $unifiedOrder->setParameter("body","微信账户充值");//商品描述
                //自定义订单号，此处仅作举例
                $unifiedOrder->setParameter("out_trade_no",$order_id);//商户订单号

                $unifiedOrder->setParameter("total_fee",$order->COCost*100);//总金额-分为单位，不能带有小数
                $unifiedOrder->setParameter("notify_url",WxPayConf_pub::NOTIFY_URL);//通知地址
                $unifiedOrder->setParameter("trade_type","JSAPI");//交易类型
                //非必填参数，商户可根据实际情况选填
                //$unifiedOrder->setParameter("sub_mch_id","XXXX");//子商户号
                //$unifiedOrder->setParameter("device_info","XXXX");//设备号
                //$unifiedOrder->setParameter("attach","XXXX");//附加数据
                //$unifiedOrder->setParameter("time_start","XXXX");//交易起始时间
                //$unifiedOrder->setParameter("time_expire","XXXX");//交易结束时间
                //$unifiedOrder->setParameter("goods_tag","XXXX");//商品标记
                //$unifiedOrder->setParameter("openid","XXXX");//用户标识
                //$unifiedOrder->setParameter("product_id","XXXX");//商品ID

                $prepay_id = $unifiedOrder->getPrepayId();
                //=========步骤3：使用jsapi调起支付============
                $jsApi->setPrepayId($prepay_id);
                //dd($prepay_id);
                $jsApiParameters = $jsApi->getParameters();
                return View::make('pay/recharge',compact('jsApiParameters','order_id'));
            }


        }
        return View::make('pay/recharge');
    }

    public function CallTest()
    {
        return View::make('pay/test');
    }
    //同步通知
    public function doReturnCall()
    {
        $this->middleware('CusAuth');
        $order_id=Input::get('order_id');

        $user=User::Auth();


        $order=UserOrder::where('COID',$order_id)->where('COCustomerID',$user->CID)->first();
        if($order){
            if($order->COPayed!='ok'){

                $user->doSave(array('CID'=>$user->CID,'CAmount'=>$user->CAmount+$order->COCost));

                $order->doSave(array('COID'=>$order_id,'COPayed'=>'ok'));
            }

            die('充值成功');
        }else{
            die("订单不存在");
        }

    }
    public function doReturnAsynCall()
    {
        //file_put_contents('../test/log.txt','|doReturnAsynCall',FILE_APPEND);
        $xml = file_get_contents('php://input');
        $service=new Wxpay_server_pub();

        $service->saveData($xml);
        $service->checkSign();
       // file_put_contents('../test/log.txt','|验证',FILE_APPEND);

        if($service->checkSign()){
            $arr=$service->getData();
            if($arr['result_code']=='SUCCESS'){
               // file_put_contents('../test/log.txt','|验证成功',FILE_APPEND);
                $user=User::where('CWebChatID',$arr['openid'])->first();
                $order=UserOrder::where('COID',$arr['out_trade_no'])->where('COCustomerID',$user->CID)->first();

                if($order){
                    if($order->COPayed!='ok'){

                        $user->doSave(array('CID'=>$user->CID,'CAmount'=>$user->CAmount+$order->COCost));

                        $order->doSave(array('COID'=>$arr['out_trade_no'],'COPayed'=>'ok'));
                    }
                  //  file_put_contents('../test/log.txt','|保存数据成功',FILE_APPEND);
                   // die('充值成功');
                    $service->setReturnParameter('return_code','SUCCESS');
                    $service->setReturnParameter('return_msg','OK');
                    $xml=$service->createXml();
                    //dd($xml);
                    $response=Response::make($xml,200);
                    $response->header('Content-Type',' text/xml');

                    return $response;
                }else{
                    die("订单不存在");

                }
            }

        }

    }

    //异步通知
    public function asyPayResCheck()
    {
        /**
         * 通用通知接口demo
         * ====================================================
         * 支付完成后，微信会把相关支付和用户信息发送到商户设定的通知URL，
         * 商户接收回调信息后，根据需要设定相应的处理流程。
         *
         * 这里举例使用log文件形式记录回调信息。
         */
        //使用通用通知接口
        $notify = new Notify_pub();
        //存储微信的回调
        $xml=file_get_contents("php://input");

        $notify->saveData($xml);


        //验证签名，并回应微信。
        //对后台通知交互时，如果微信收到商户的应答不是成功或超时，微信认为通知失败，
        //微信会通过一定的策略（如30分钟共8次）定期重新发起通知，
        //尽可能提高通知的成功率，但微信不保证通知最终能成功。
        if($notify->checkSign() == FALSE){
            $notify->setReturnParameter("return_code","FAIL");//返回状态码
            $notify->setReturnParameter("return_msg","签名失败");//返回信息
        }else{
            Log::info('SUCCESS。订单ID:'.$notify->data["out_trade_no"]);
            $notify->setReturnParameter("return_code","SUCCESS");//设置返回码
        }
        $returnXml = $notify->returnXml();
        echo $returnXml;

        //==商户根据实际情况设置相应的处理流程，此处仅作举例=======

        //以log文件形式记录回调信息



        if($notify->checkSign() == TRUE)
        {
            if ($notify->data["return_code"] == "FAIL") {
                //此处应该更新一下订单状态，商户自行增删操作
                //Log::info("【通信出错】:\n".$xml."\n");
            }
            elseif($notify->data["result_code"] == "FAIL"){
                //此处应该更新一下订单状态，商户自行增删操作
                // Log::info("【业务出错】:\n".$xml."\n");
            }
            else{
                //此处应该更新一下订单状态，商户自行增删操作
                // Log::info("【支付成功】:\n".$xml."\n");
            }

            if($notify->data["result_code"] == "SUCCESS"){
                $order=Order::find($notify->data["out_trade_no"]);
                if($order->status==Order::getStatusIDByKeyword(Order::GOT_ORDER)){
                    $order->setStatus(Order::SETTLED);
                }
            }



        }
    }



}


